/* 
    withLatestFrom 运作方式跟combineLatest 有点像，只是他有主从的关系，
    只有在主要的observable 送出新的值时，才会执行callback，附随的observable 只是在背景下运作。
    让我们看一个例子
*/

const main = Rx.Observable.from('hello').zip(Rx.Observable.interval(500), (x, y) => x);
const some = Rx.Observable.from([0,1,0,0,0,1]).zip(Rx.Observable.interval(300), (x, y) => x);

const example = main.withLatestFrom(some, (x, y) => {
    return y === 1 ? x.toUpperCase() : x;
});

example.subscribe({
    next: (value) => { console.log(value); },
    error: (err) => { console.log('Error: ' + err); },
    complete: () => { console.log('complete'); }
});

/* 
    withLatestFrom 会在main 送出值的时候执行callback，
    但请注意如果main 送出值时some 之前没有送出过任何值callback 仍然不会执行！
*/

/* 
    main   : ----h----e----l----l----o|
    some   : --0--1--0--0--0--1|

    withLatestFrom(some, (x, y) =>  y === 1 ? x.toUpperCase() : x);

    example: ----h----e----l----L----O|
*/
/* 
    withLatestFrom 很常用在一些checkbox 型的功能，例如说一个编辑器，我们开启粗体后，
    打出来的字就都要变粗体，粗体就像是some observable，而我们打字就是main observable。
*/